from flask import request, jsonify, session, Response
from sqlalchemy import and_
from aps.models.fase import *
from aps.models.grafo import *
from aps.models.item import *
from aps.models.solicitud import *
from aps.models.solicituditem import *
from aps.models.voto import *
from aps.models.proyectousuario import *
from aps.models.proyectousuario import *
from aps.views.historialsolicitud import *

from aps import app

@app.route('/soy_dueno', methods=['GET', 'POST'])
def soy_dueno():
    """
    Nos permite traer los parametros que fueron cargados por el usuario 
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """     
    idsolicitud = request.form['idsolicitud']
    idusuario     = session['idusuario']
    
    solicitud     = bdsession.query(Solicitud).filter_by(id=model.id).first()
    if solicitud.idusuario == idusuario:
        return jsonify({'success' : True})    
    return jsonify({'success' : False})  

@app.route('/crear_solicitud', methods=['GET', 'POST'])
def crear_solicitud():
    """
    Nos permite traer los parametros que fueron cargados por el usuario 
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """     
    idusuario     = session['idusuario']
    descripcion   = request.form['descripcion']
    received      = eval(request.form['data'])
    id_fase       = received ['id_fase']
    data          = received['data']
    
    # se agrega a la BD
    model         = Solicitud(idusuario, id_fase, descripcion, 'ACTIVO')
    bdsession.add(model)
    bdsession.flush()
    solicitud     = bdsession.query(Solicitud).filter_by(id=model.id).first()
    
    print solicitud
    for id_item in data:
        model2    = SolicitudItem(solicitud.id, id_item)
        bdsession.add(model2)
        
    # Creamos una entrada en el historial solicitud
    log_it_solicitud(solicitud.id,session['usuario'],'Solicitud creada, estado : ACTIVO')

        
    return jsonify({'success' : True})
  
@app.route('/modificar_solicitud', methods=['GET', 'POST'])
def modificar_solicitud():
    """
    Nos permite traer los parametros que fueron modificados por el usuario
    y guardar los cambios en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """ 
    id            = request.form['id']
    idusuario     = session['idusuario']
    descripcion   = request.form['descripcion']
    received      = eval(request.form['data'])
    idfase       = received['id_fase']
    data          = received['data']
    # se modifica 
    model         = Solicitud(idusuario, idfase, descripcion, 'ACTIVO')
    model.id      = id
    bdsession.merge(model)   
    bdsession.query(SolicitudItem).filter_by(idsolicitud=id).delete()
    for id_item in data:
        model2    = SolicitudItem(id, id_item)
        bdsession.add(model2)
        
     # Creamos una entrada en el historial solicitud
    log_it_solicitud(id,session['usuario'],'La solicitud fue modificada, estado : ACTIVO')
    return jsonify({'success' : True})
  
@app.route('/eliminar_solicitud', methods=['GET', 'POST'])
def eliminar_solicitud():
    """
    Nos permite traer el id de la solicitud a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente y False en caso contrario 
    """ 
    id          = request.form['id']
    idusuario   = session['idusuario']
    
    solicitud = bdsession.query(Solicitud).filter_by(id=id).first()
    if solicitud.idusuario is None:
        return jsonify ({'success':False})
    
    # Creamos una entrada en el historial solicitud
    log_it_solicitud(id,session['usuario'],'La solicitud fue eliminada')
    
    # eliminamos de la BD
    bdsession.query(Voto).filter_by(idsolicitud=id).delete()
    bdsession.query(SolicitudItem).filter_by(idsolicitud=id).delete()
    bdsession.delete(solicitud)  
    
    
    return jsonify({'success':True})
  

@app.route('/enviar_solicitud', methods=['GET', 'POST'])
def enviar_solicitud():
    """
    Nos permite traer el id de la solicitud a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente y False en caso contrario 
    """ 
    id          = request.form['id']
    idusuario   = session['idusuario']
    
    solicitud = bdsession.query(Solicitud).filter_by(id=id).first()
    if solicitud.idusuario is None:
        return jsonify ({'success':False})
    # eliminamos de la BD
    solicitud.estado= 'ENVIADA'  
    
    # Creamos una entrada en el historial solicitud
    log_it_solicitud(id,session['usuario'],'La solicitud fue enviada, estado : ENVIADA')
    return jsonify({'success':True})

@app.route('/consultar_solicitud', methods=['GET', 'POST'])  
def consultar_solicitud():
    """
    Nos permite traer los parametros de consulta(el filtro y el valor) y mostrar
    las solicitudes que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return: si la accion se realizo correctamente
    """ 
    
    
    #cen el caso de que el usuario sea miembro del comite
    id_usuario = session['idusuario']
    id_fase = request.args['idfase']
    solicitudes = None
    idrol= 0
    ## si el usuario es miembro del comite tiene el idrol = 3
    if request.args.has_key('idrol'):
        idrol=request.args['idrol']
    print idrol
    if idrol == '3':
        print "entro"
        if request.args.has_key('filtro'):
            filtro     =request.args['filtro']
            valor      = request.args['valor']
         
            sentencia  = 'SELECT * from solicitud WHERE idfase={0}  AND {1} =\'{2}\''.format(id_fase,filtro,valor)
            solicitudes = bdsession.query(Solicitud).from_statement(sentencia).all()
        else:
            print "no tiene filtro"
            ### obtener todas las solicitudes enviadas
            solicitudes = bdsession.query(Solicitud).filter(Solicitud.idfase==id_fase, Solicitud.estado !='ACTIVO').all()
    else:
          
        if request.args.has_key('filtro'):
            filtro     =request.args['filtro']
            valor      = request.args['valor']
         
            sentencia  = 'SELECT * from solicitud WHERE idfase={0} AND idusuario = {1} AND {2} =\'{3}\''.format(id_fase,id_usuario,filtro,valor)
            solicitudes = bdsession.query(Solicitud).from_statement(sentencia).all()
        else:
            ### obtener solo las solicitudes que el usuario creo
            solicitudes = bdsession.query(Solicitud).filter_by(idfase=id_fase, idusuario=session['idusuario']).all()
            
      
    data = []
    for solicitud in solicitudes:
        item = {}
        item['id'] = solicitud.id
        item['fase'] = solicitud.idfase
        item['usuario'] = solicitud.idusuario
        item['descripcion'] = solicitud.descripcion
        item['estado'] = solicitud.estado
        data.append(item)
    return jsonify({'success':True, 'data':data, 'total':len(data)})

@app.route('/votar', methods=['GET', 'POST'])
def votar():
    """
    Nos permite traer los parametros que fueron cargados por el usuario 
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """     
    idsolicitud = request.form['idsolicitud']
    idusuario   = session['idusuario']
    votoutil   = request.form['voto']
    idproyecto = request.form['idproyecto']
    sentencia  = 'SELECT * from voto WHERE idsolicitud={0} AND idusuario = {1}'.format(idsolicitud,idusuario)
    voto = bdsession.query(Voto).from_statement(sentencia).first()
    
    
#     cantComite = bdsession.query(ProyectoUsuario).from_statement(sentencia2).count()

    if voto is None:
        solicitud = bdsession.query(Solicitud).filter_by(id=idsolicitud).first()

        
        #se VOTA
        votoS = Voto(idusuario,idsolicitud, votoutil)
        bdsession.add(votoS)           
        # Creamos una entrada en el historial solicitud del voto del usuario
        log_it_solicitud(solicitud.id,session['usuario'],'El usuario '+ session['usuario'] + ' voto : '+votoutil,1)
        
        #session.query(User).filter(User.name.like('%ed')).count() 
        
        cantComite    = bdsession.query(ProyectoUsuario).filter(and_(ProyectoUsuario.idproyecto== idproyecto, ProyectoUsuario.comite== 1)).count()
        cantVotos = bdsession.query(Voto).filter_by(idsolicitud=idsolicitud).count()
        
        #SE VERIFICA SI TERMINO LA VOTACION 
        if cantVotos == cantComite:
            favor    = bdsession.query(Voto).filter(and_(Voto.idsolicitud== idsolicitud, Voto.votoutil== 'Si')).count()
            
            if favor > (cantComite-favor):
                #se aprueba la solicitud
                solicitud.estado = 'APROBADO'
                bdsession.merge(solicitud)
                
                # Creamos una entrada en el historial solicitud termino de la solicitud
                log_it_solicitud(solicitud.id,session['usuario'],'Termino la votacion! estado de la solicitud: ' +solicitud.estado)        
                
                grafo   = Grafo(idproyecto)
                solitem = bdsession.query(SolicitudItem).filter_by(idsolicitud=idsolicitud).all()
                for si in solitem:
                    grafo.marcar_revision_sucesores(si.iditem)
                    item = bdsession.query(Item).filter_by(id=si.iditem).first()
                    item.estado  = 'ACTIVO'
                    lb = None
                    lb = bdsession.query(Lineabase).filter_by(id=item.idlineabase).first()
                    if lb is not None:
                        lb.estado = "Abierta"

                    bdsession.merge(item)
                    
            else:                 
                #se desaprueba                
                solicitud.estado = 'DESAPROBADO'
                bdsession.merge(solicitud)
                # Creamos una entrada en el historial solicitud termino de la solicitud
                log_it_solicitud(solicitud.id,session['usuario'],'Termino la votacion! estado de la solicitud: ' +solicitud.estado)
        return jsonify({'success' : True})
    return jsonify({'success' : False, 'mensaje': 'No puede votar 2 veces'}) 
